﻿using UnityEngine;
using System.Collections.Generic;
using System.Collections;

namespace IMIForUnity
{
    public interface IManager
    {
        /// <summary>
        /// 判断设备是否打开 
        /// </summary>
        /// <returns>true  打开  false 未打开</returns>
        bool IsDeviceWorking();

        /// <summary>
        /// 打开设备,该方法会打开默认的流，默认的流由开关控制
        /// </summary>
        void OpenDevice();

        /// <summary>
        /// 打开设备，并指定打开相应的流；该方法等同于先在Unity里面勾选相应的流，然后调用Opendevice() 
        /// </summary>
        /// <param name="openDepthTexture">需要深度图</param>
        /// <param name="openSkeletonData">需要骨骼数据</param>
        /// <param name="openUserDepthTexture">需要包含用户id的深度图</param>
        /// <param name="openColorTexture">需要彩色图</param>
        void OpenDevice(bool openDepthTexture, bool openSkeletonData, bool openUserDepthTexture, bool openColorTexture);

        /// <summary>
        /// 打开设备，并打开相应的流 来获取彩色抠图
        /// 彩色抠图无法与彩色图、深度图同时使用,因此打开该方法会覆盖其他流，只能获取彩色抠图
        /// </summary>
        /// <param name="openUserColorTexture">一般是传true</param>
        void OpenDevice(bool openUserColorTexture);

        /// <summary>
        /// 打开默认流
        /// </summary>
        void OpenStream();

        /// <summary>
        /// 重新打开指定流
        /// </summary>
        /// <param name="openDepthTexture">需要深度图</param>
        /// <param name="openSkeletonData">需要骨骼数据</param>
        /// <param name="openUserDepthTexture">需要包含用户ID的深度图（可以来标识用户）</param>
        /// <param name="openColorTexture">需要彩色图</param>
        void OpenStream(bool openDepthTexture, bool openSkeletonData, bool openUserDepthTexture, bool openColorTexture);

        /// <summary>
        /// 打开可用于彩色抠图的流
        /// 彩色抠图无法与彩色图、深度图同时使用,因此打开该方法会覆盖其他流，只能获取彩色抠图
        /// </summary>
        /// <param name="openUserColorTexture"></param>
        void OpenStream(bool openUserColorTexture);

        /// <summary>
        /// 关闭相应流
        /// </summary>
        void CloseStream();

        /// <summary>
        /// 获得ImiDevice，让用户自行打开相应流以及获取、处理数据
        /// 只有调用OpenDeviceManually();
        /// </summary>
        ImiDevice GetDevice();


        /// <summary>
        /// 关闭设备，该方法会关闭所打开的流以及释放内存
        /// </summary>
        /// <returns></returns>
        void CloseDevice();

        /// <summary>
        /// 获取彩色图分辨率
        /// </summary>
        ImiResolution GetColorResolution();

        /// <summary>
        /// 获取深度图分辨率
        /// </summary>
        ImiResolution GetDepthResolution();

        /// <summary>
        /// 获取彩色图 
        /// </summary>
        Texture2D GetColorTexture();

        /// <summary>
        /// 获取指定玩家彩色抠图
        /// </summary>
        Texture2D GetColorTexture(int userId);

        /// <summary>
        /// 获取指定玩家列表的彩色抠图（整合到一张图中） 
        /// </summary>
        /// <param name="ids"></param>
        /// <returns></returns>
        Texture2D GetColorTexture(List<int> ids);

        /// <summary>
        /// 获取主控玩家的彩色抠图 
        /// </summary>
        Texture2D GetMainUserColorTexture();

        /// <summary>
        /// 获取主控玩家的彩色抠图，并居中
        /// </summary>
        Texture2D GetMainUserColorTextureInCenter();


        /// <summary>
        /// 获取副控玩家的彩色抠图
        /// </summary>
        /// <returns></returns>
        Texture2D GetSubUserColorTexture();

        /// <summary>
        /// 获取副控玩家的彩色抠图并居中
        /// </summary>
        /// <returns></returns>
        Texture2D GetSubUserColorTextureInCenter();
        /// <summary>
        /// 获取指定玩家的彩色抠图并居中显示
        /// </summary>
        /// <param name="userId"></param>
        /// <returns></returns>
        Texture2D GetUserColorTextureInCenter(int userId);

        /// <summary>
        /// 获取深度图（不含用户标志）
        /// </summary>
        Texture2D GetDepthTexture();

        /// <summary>
        /// 获取含有用户标识的深度图
        /// </summary>
        Texture2D GetUserDepthTexture();

        /// <summary>
        /// 获取指定用户的前景抠图
        /// </summary>
        Texture2D GetUserDepthTexture(int userId);

        /// <summary>
        /// 获取指定用户列表的前景抠图
        /// </summary>
		Texture2D GetUserDepthTexture(List<int> userId);

        /// <summary>
        /// 获取主控玩家的前景抠图
        /// </summary>
        Texture2D GetMainUserDepthTexture();

        /// <summary>
        /// 获取副控玩家的前景抠图
        /// </summary>
        Texture2D GetSubUserDepthTexture();

        /// <summary>
        /// 设置跟踪玩家的模式（最近或者挥手）,被跟踪到的玩家会有骨骼信息返回（目前只支持最近玩家）
        /// </summary>
        void SetUserTrackingMode(UserTrackingMode mode);

        /// <summary>
        /// 设置控制玩家选择模式，默认为较近的玩家成为控制玩家
        /// </summary>
        /// <param name="mode"></param>
        void SetPlayerControlMode(PlayerControlMode mode);

        /// <summary>
        /// 设置跟踪的UserId，强行跟踪该玩家的骨骼(TODO)
        /// </summary>
        bool SetTrackingUserId(int userId);


        /// <summary>
        /// 获取所有玩家的信息 
        /// </summary>
        Dictionary<int, ImiPlayerInfo> GetPlayerInfos();

        /// <summary>
        /// 获取用户信息
        /// </summary>
        /// <param name="userIndex">用户Id,可以通过GetControlPlayerId()等方法获取</param>
        ImiPlayerInfo GetPlayerInfo(int userIndex);

        ImiPlayerInfo GetMainPlayerInfo();

        ImiPlayerInfo GetSubPlayerInfo();

        /// <summary>
        /// 获取标准化骨骼，骨骼坐标以 Hip Center为原点，根据玩家远近进行相应缩放
        /// </summary>
        /// <param name="userIndex"></param>
        /// <returns></returns>
        Vector3[] GetNormalizedSkeleton(int userIndex);

        /// <summary>
        /// 获取居中的玩家彩色抠图，玩家抠图位于图片正中，并且根据玩家远近进行缩放
        /// </summary>
        /// <param name="userIndex"></param>
        /// <returns></returns>
        Texture2D GetColorTextureInCenter(int userIndex);

        /// <summary>
        /// 设置主控玩家；
        /// 1. 该方法可能会触发主控玩家变更的回调
        /// 2. 该方法会调用setPlayerAssigned(true)
        /// </summary>
        void SetControlPlayerId(int userId);

        /// <summary>
        /// 设置主控玩家是否被手动分配
        /// false：自动分配，离摄像头最近的玩家成为控制玩家，并且每一帧自动更新
        /// true : 手动分配，由用户控制自己按照playerId来分配主控玩家
        /// </summary>
        /// <param name="isAssigned"></param>
        //void SetControlPlayerAssigned(bool isAssigned);

        /// <summary>
        /// 获取主控玩家Id
        /// </summary>
        int GetControlPlayerId();

        /// <summary>
        /// 获取副控玩家Id
        /// </summary>
        int GetSubPlayerId();

        /// <summary>
        /// 设置主控玩家变更的Observer
        /// </summary>
        void SetControlPlayerChangeListener(ImiManager.OnControlPlayerChanged observer);

        /// <summary>
        /// 设置新玩家进入的Observer
        /// </summary>
        void SetPlayerEnteredListener(ImiManager.OnPlayerEntered observer);

        /// <summary>
        /// 设置玩家丢失的Observer
        /// </summary>
        /// <param name="observer"></param>
        void SetPlayerLostListener(ImiManager.OnPlayerLost observer);

        /// <summary>
        /// 设置自定义深度数据处理方法
        /// </summary>
        void SetDepthDataProcessor(ImiManager.DepthDataProcessor processor);

        /// <summary>
        /// 自定义彩色图数据处理
        /// </summary>
        void SetColorDataProcessor(ImiManager.ColorDataProcessor processor);

        /// <summary>
        /// 自定义彩色+深度数据处理（抠图用）
        /// </summary>
        void SetRawDataProcessor(ImiManager.RawDataProcessor processor);

        /// <summary>
        /// 获取设备信息
        /// </summary>
        /// <returns></returns>
        ImiDeviceInfo GetDeviceInfo();

    }

}